/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package br.siagefi.mb;

import br.com.caelum.stella.bean.validation.CNPJ;
import br.com.caelum.stella.bean.validation.CPF;
import br.siagefi.enuns.UnidadesFederativas;
import br.siagefi.model.ClientePF;
import br.siagefi.model.ClientePJ;
import br.siagefi.service.ClientePFService;
import br.siagefi.service.ClientePJService;
import br.siagefi.util.FacesUtil;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;


/**
 *
 * @author NOTE
 */

@ManagedBean
@SessionScoped
public class ClienteBean implements Serializable{
   
    private ClientePF clientePF;
    private ClientePJ clientePJ;
    private List<ClientePF> clientesPF;
    private List<ClientePJ> clientesPJ;
    private final ClientePFService servicePF;
    private final ClientePJService servicePJ;
    private String tipoPessoa;
    
    @CPF(message = "CPF invalido!")
    private String cpf;
    
    @CNPJ(message = "CNPJ Invalido!")
    private String cnpj;

    public ClienteBean() {
        this.servicePF = new ClientePFService();
        this.servicePJ = new ClientePJService();
        this.clientesPF = new ArrayList<>();
        this.clientesPJ = new ArrayList<>();
        this.clientePF = new ClientePF();
        this.clientePJ = new ClientePJ();
    }  
    
    // navegação
    
    //template
    public String gerenciarCliente(){
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove("clienteBean");
        return"/pages/users/operador/cliente";
    }
    
    public String novo() {
        if(this.getTipoPessoa().equals("PJ")){
            if(this.getCnpj().isEmpty()){
                FacesUtil.addErrorMessage("O 'CNPJ' deve ser informado!");
                return "Cliente";
            } else{
                this.getClientePJ().setCnpj(this.getCnpj());
            }
            if (servicePJ.jaExiste(this.getClientePJ())) {
                FacesUtil.addErrorMessage("Cliente já cadastrado anteriormente!");
                return "cliente";
            }
            this.getClientePJ().setClienteDesde(new GregorianCalendar().getInstance().getTime());
            return "incluirClientePJ";
        } else {
            if(this.getTipoPessoa().equals("PF")){
                if(this.getCpf().isEmpty()){
                    FacesUtil.addErrorMessage("O 'CPF' deve ser informado!");
                    return "cliente";
                }else{
                    this.getClientePF().setCpf(this.getCpf());
                }
                if (servicePF.jaExiste(this.getClientePF())) {
                    FacesUtil.addErrorMessage("Cliente já cadastrado anteriormente!");
                    return "cliente";
                } 
                this.getClientePF().setClienteDesde(new GregorianCalendar().getInstance().getTime());
                return "incluirClientePF";
            } else {
              this.limpar();
              FacesUtil.addErrorMessage("Selecione o tipo de pessoa!");
              return "cliente";
            }
        }
    }
    
    public String alterarClientePJ(ClientePJ clientePJ) {
            this.setClientePJ(clientePJ);
            return "consultarClientePJ";
    }
    
    public String alterarClientePF(ClientePF clientePF) {
            this.setClientePF(clientePF);
            return "consultarClientePF";
    }
    
    public String voltarParaCliente(){
        this.limpar();
        return "cliente";
    }
    
    public String limpar(){
        this.setTipoPessoa(new String());
        this.setCpf(new String());
        this.setCnpj(new String());
        this.setClientePF(new ClientePF());
        this.setClientePJ(new ClientePJ());
        this.setClientesPF(new ArrayList<ClientePF>());
        this.setClientesPJ(new ArrayList<ClientePJ>());
        return "cliente";
    }
    
    public String encerrar(){
        this.limpar();
        return "./../index";
    }
    
    // persistência
    
    public String gravarClientePJ() {
        if (this.getClientePJ().getId() == null) {
            //incluir
            System.out.println("Incluir novo Cliente PJ");
            if (servicePJ.jaExiste(this.getClientePJ())) {
                FacesUtil.addErrorMessage("Cliente já cadastrado anteriormente!");
            } else {
                servicePJ.inserir(this.getClientePJ());
                FacesUtil.addSuccessMessage("Cliente cadastrado com sucesso!");
            }
        } else {
            //alterar
            System.out.println("Alterar Cliente PJ");
            servicePJ.alterar(this.getClientePJ());
            FacesUtil.addSuccessMessage("Cliente alterado com sucesso!");
        }
        this.limpar();
        return "cliente";
    }
    
    public String gravarClientePF() {
        if (this.getClientePF().getId() == null) {
            //incluir
            System.out.println("Incluir novo Cliente PF");
            if (servicePF.jaExiste(this.getClientePF())) {
                FacesUtil.addErrorMessage("Cliente já cadastrado anteriormente!");
            } else {
                System.out.println("Alterar Cliente PF");
                servicePF.inserir(this.getClientePF());
                FacesUtil.addSuccessMessage("Cliente cadastrado com sucesso!");
            }
        } else {
            //alterar
            servicePF.alterar(this.getClientePF());
            FacesUtil.addSuccessMessage("Cliente alterados com sucesso!");
        }
        this.limpar();
        return "cliente";
    }
    
    public String removerClientePJ(ClientePJ clientePJ) {
        if (servicePJ.existeDocumentoVinculado(clientePJ)) {
            FacesUtil.addErrorMessage("Cliente possui documentos vinculados. Exclusão não permitida!");
            return "cliente";
        }
        if(servicePJ.existeNotaFiscalVinculada(clientePJ)){
            FacesUtil.addErrorMessage("Cliente possui notas fiscais vinculadas. Exclusão não permitida!");
            return "cliente";
        }
        servicePJ.remover(clientePJ);
        this.limpar();
        FacesUtil.addSuccessMessage("Cliente excluido com sucesso!");
        return "cliente";
    }
        
    public String removerClientePF(ClientePF clientePF) {
        if (servicePF.existeDocumentoVinculado(clientePF)) {
            FacesUtil.addErrorMessage("Cliente possui documentos vinculados. Exclusão não permitida.");
            return "cliente";
        }
        if(servicePF.existeNotaFiscalVinculada(clientePF)){
            FacesUtil.addErrorMessage("Cliente possui notas fiscais vinculadas. Exclusão não permitida.");
            return "cliente";
        }
        servicePF.remover(clientePF);
        this.limpar();
        FacesUtil.addSuccessMessage("Cliente excluido com sucesso!");
        return "cliente";
    }
    
    public String consultar(){
        System.out.println(this.getTipoPessoa());
        if(this.getTipoPessoa().equals("PJ")){
            if(this.getCnpj().isEmpty()){
                FacesUtil.addErrorMessage("O 'CNPJ' deve ser informado!");
                return "Cliente";
            }
            this.consultaPorCNPJ(this.getCnpj());
            if(this.getClientePJ() == null){
                FacesUtil.addErrorMessage("Não foram localizados clientes para o tipo de pesquisa!");
            }else {
                return "consultarClientePJ";
            }
        }
        if(this.getTipoPessoa().equals("PF")){
            if(this.getCpf().isEmpty()){
                FacesUtil.addErrorMessage("O 'CPF' deve ser informado!");
                return "Cliente";
            }
            this.consultaPorCPF(this.getCpf());
            if(this.getClientePF() == null){
                FacesUtil.addErrorMessage("Não foram localizados clientes para o tipo de pesquisa!");
            }else {
                return "consultarClientePF";
            }
        }
        if(this.getTipoPessoa() == null){
            FacesUtil.addErrorMessage("Informe o tipo de pessoa e o CPF ou CNPJ.");
        }
        return "cliente";
    }
    
    public void consultaPorCPF(String cpf){
        this.setClientePF(servicePF.listarPorCPF(cpf));
    }
    
    public void consultaPorCNPJ(String cnpj){
        this.setClientePJ(servicePJ.listarPorCNPJ(cnpj));
    }
    
    public String listarClientes(){
        this.setCpf(new String());
        this.setCnpj(new String());
        this.setClientePF(new ClientePF());
        this.setClientePJ(new ClientePJ());
        if(this.getTipoPessoa().equals("PJ")){
           this.setClientesPJ(servicePJ.listar());
           if(this.getClientesPJ().isEmpty()){
               FacesUtil.addErrorMessage("Não foram localizados clientes para o tipo de pesquisa!");
           }
           return "cliente";
        }
        if(this.getTipoPessoa().equals("PF")){
            this.setClientesPF(servicePF.listar());
            if(this.getClientesPF().isEmpty()){
               FacesUtil.addErrorMessage("Não foram localizados clientes para o tipo de pesquisa!");
           }
           return "cliente";
        }
        this.limpar();
        FacesUtil.addErrorMessage("Informe o tipo de pessoa.");
        return "cliente";
    }
    
    // listas e outros dados
    
    public List<UnidadesFederativas> getUnidadesFederativas() {
        return Arrays.asList(UnidadesFederativas.values());
    }
    
    public Date getDataAtual(){
        return new GregorianCalendar().getInstance().getTime();
    }
    
    //getters e setters

    public ClientePF getClientePF() {
        return clientePF;
    }

    public void setClientePF(ClientePF clientePF) {
        this.clientePF = clientePF;
    }

    public ClientePJ getClientePJ() {
        return clientePJ;
    }

    public void setClientePJ(ClientePJ clientePJ) {
        this.clientePJ = clientePJ;
    }

    public List<ClientePF> getClientesPF() {
        return clientesPF;
    }

    public void setClientesPF(List<ClientePF> clientesPF) {
        this.clientesPF = clientesPF;
    }

    public List<ClientePJ> getClientesPJ() {
        return clientesPJ;
    }

    public void setClientesPJ(List<ClientePJ> clientesPJ) {
        this.clientesPJ = clientesPJ;
    }

    public String getTipoPessoa() {
        return tipoPessoa;
    }

    public void setTipoPessoa(String tipoPessoa) {
        this.tipoPessoa = tipoPessoa;
    }

    public String getCpf() {
        return cpf;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    public String getCnpj() {
        return cnpj;
    }

    public void setCnpj(String cnpj) {
        this.cnpj = cnpj;
    }

}
